import os
from copy import deepcopy


class StatChar:

    textContent = ""

    def __init__(self, filePath=None, textContent="") -> None:
        if not filePath is None:
            self.read_text(filePath)
        if self.textContent == "":
            self.textContent = textContent

    #  读文本文件，生成字符串

    def read_text(self, filePath: str):
        if os.path.exists(filePath):
            with open(filePath, "rt", encoding="utf-8", errors="ignore") as f:
                self.textContent = f.read()

    #  统计字频
    def stat_char(self) -> list:
        text = deepcopy(self.textContent)
        #  删除英文字母、数字、半角和全角标点符号
        for c in "abcdefghijklmnopqrstuvwxyz" \
            "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" \
            " ~!@#$%^&*()_+=-`[]\{}|:\";',./<>?，。、　" \
                "《》？；’：”“【】、｛｝§=-+——）（*&……%￥#@！～·\n":
            text = text.replace(c, "")
        #  构造字典，以字符为键，以其出现次数为值
        chars = {}
        for c in text:
            #  若该字符为首次出现，增加键，构造字典，以字符为键，以其出现次数为值
            chars[c] = chars.get(c, 0) + 1
        result = list(chars.items())  # 由字典构造列表
        #  以字符出现频率排序，降序
        #  key 为用户定义的回调函数，用于指定比较大小关系的数据对象
        #  sort() 函数执行时，传递待排序序列的元素给用户定义的 lambda 表达式
        #  lambda 表达式参数 x 接收到该元素
        #  返回该元素（元组）的第 1 项（字频统计值）作为 sort() 函数比较依据
        result.sort(key=lambda x: x[1], reverse=True)
        return result


if __name__ == "__main__":
    sc = StatChar(textContent="你好")
    print(sc.stat_char())
